Дата.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(******************************************************************************)
(**)                          ОТДЕЛ Дата;
(******************************************************************************)
(* НАЗНАЧЕНИЕ: работа с календарём                                            *) 
(******************************************************************************)

ВИД
  Вид- = НАБОР 
    день,месяц,год:ЦЕЛ 
  КОН; 

(****************************************************************************** 
 * Переводит дату в число дней, прошедших от начала 1 года н. э. (числовое 
 * представление даты)
 ******************************************************************************) 
ЗАДАЧА ВЧисло-(дата-:Вид):ЦЕЛ; 
ПЕР 
  y,m,n:ЦЕЛ; 
УКАЗ 
  y:=дата.год; 
  m:=дата.месяц -3; 
  ЕСЛИ m < 0 ТО 
    УВЕЛИЧИТЬ(m,12); 
    УМЕНЬШИТЬ(y) 
  КОН; 
  n:=(y*1461 ДЕЛИТЬ 4) + ((m*153+2) ДЕЛИТЬ 5) + дата.день - 306; 
  ЕСЛИ n > 577737 ТО 
    n:=n - ((y ДЕЛИТЬ 100)*3 - 5) ДЕЛИТЬ 4 
  КОН; 
  ВОЗВРАТ n 
КОН ВЧисло; 

(****************************************************************************** 
 * Переводит число дней, прошедших от начала 1 года н.э. в дату
 ******************************************************************************) 
ЗАДАЧА ИзЧисла-(n:ЦЕЛ; дата+:Вид); 
ПЕР 
  c,y,m:ЦЕЛ; 
УКАЗ 
  ЕСЛИ n > 577737 ТО 
    n:=n*4 +1215; 
    c:=n ДЕЛИТЬ 146097; 
    n:=n ОСТАТОК 146097 ДЕЛИТЬ 4 
  ИНАЧЕ 
    n:=n +305; 
    c:=0 
  КОН; 
  n:=n*4 +3; 
  y:=n ДЕЛИТЬ 1461; 
  n:=n ОСТАТОК 1461 ДЕЛИТЬ 4; 
  n:=n*5 +2; 
  m:=n ДЕЛИТЬ 153; 
  n:=n ОСТАТОК 153 ДЕЛИТЬ 5; 
  ЕСЛИ m > 9 ТО 
    m:=m -12; 
    УВЕЛИЧИТЬ(y) 
  КОН; 
  дата.год:=100*c + y; 
  дата.месяц:=m +3; 
  дата.день:=n +1 
КОН ИзЧисла; 

(****************************************************************************** 
 * Вычисляет, является ли год високосным 
 ******************************************************************************) 
ЗАДАЧА Високосный-(год:ЦЕЛ):КЛЮЧ; 
УКАЗ 
  ВОЗВРАТ ((год ОСТАТОК 4 = 0) И (год ОСТАТОК 100 # 0)) ИЛИ (год ОСТАТОК 400 = 0)
КОН Високосный; 

(****************************************************************************** 
 * Возвращает число дней в указаном месяце данного года
 ******************************************************************************) 
ЗАДАЧА ДнейВМесяце-(месяц,год:ЦЕЛ):ЦЕЛ; 
ПЕР
  дней:ЦЕЛ;
УКАЗ 
  ВЫБРАТЬ месяц ИЗ 
  |  1: дней:=31 
  |  2: ЕСЛИ Високосный(год) ТО дней:=29 ИНАЧЕ дней:=28 КОН 
  |  3: дней:=31 
  |  4: дней:=30 
  |  5: дней:=31 
  |  6: дней:=30 
  |  7: дней:=31 
  |  8: дней:=31 
  |  9: дней:=30 
  | 10: дней:=31 
  | 11: дней:=30 
  | 12: дней:=31 
  ИНАЧЕ 
    дней:=0 
  КОН;
  ВОЗВРАТ дней 
КОН ДнейВМесяце; 

(****************************************************************************** 
 * Возвращает число дней, которое необходимо прибавить к дате, чтобы перевести её 
 * из даты Григорианского календаря в дату Юлианского календаря (старый стиль), 
 * используя числовое представление текущей даты
 ******************************************************************************) 
ЗАДАЧА СтарыйСтиль-(n:ЦЕЛ):ЦЕЛ; 
ПЕР 
  век:ЦЕЛ; 
УКАЗ 
  век:=(n ДЕЛИТЬ 146097)*4 + ((n ОСТАТОК 146097) ДЕЛИТЬ 36524) +1; 
  ВОЗВРАТ век - ((век-1) ДЕЛИТЬ 4) -3 
КОН СтарыйСтиль; 

(****************************************************************************** 
 * Возвращает номер текущего дня недели (1-понедельник, ..., 7-воскресенье), 
 * используя числовое представление текущей даты
 ******************************************************************************) 
ЗАДАЧА ДеньНедели-(дата-:Вид):ЦЕЛ; 
ПЕР 
  c:ЦЕЛ; 
УКАЗ 
  ЕСЛИ дата.месяц < 3 ТО c:=1 ИНАЧЕ c:=0 КОН; 
  ВОЗВРАТ (
                                               (
    3*дата.год - 
  (7*(дата.год + (дата.месяц+9) ДЕЛИТЬ 12)) ДЕЛИТЬ 4 +
 (23*дата.месяц) ДЕЛИТЬ 9 +
     дата.день + 2 + ((((дата.год-c) ДЕЛИТЬ 100) +1)*3 ДЕЛИТЬ 4) -16
                                               ) ОСТАТОК 7
          ) +1 
КОН ДеньНедели; 

ЗАДАЧА ПравославнаяПасха-(год:ЦЕЛ):ЦЕЛ;
ПЕР 
  a,b,число:ЦЕЛ;
  дата:Вид;
УКАЗ 
  a:=(19*(год ОСТАТОК 19) + 15) ОСТАТОК 30; 
  b:=a + (2*(год ОСТАТОК 4) + 4*(год ОСТАТОК 7) + 6*a + 6) ОСТАТОК 7; 
  дата.год:=год; 
  дата.месяц:=(b+25) ДЕЛИТЬ 35 +3; 
  дата.день:=b + 22 - 31*(дата.месяц ДЕЛИТЬ 4); 
  число:=ВЧисло(дата); 
  ВОЗВРАТ число + СтарыйСтиль(число)
КОН ПравославнаяПасха; 

КОН Дата.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы